import { Box3Get, Box3Post, escapeHtml } from "@ap/util/request";
import * as vscode from "vscode";
import {
  showErrorMessage,
  showInformationMessage,
} from "@ap/util/vscode/message";
import { auth } from "@ap/util/request";
import { arenaErrorMsg } from "@ap/util/vscode/errorMsg";
import { CommandId } from "@ap/command";
/**
 * 扩展的QuickPickItem接口，包含评论相关的信息。
 * @extends vscode.QuickPickItem VS Code的快速选择项基础接口。
 */
interface ExtendedQuickPickItem extends vscode.QuickPickItem {
  contentId: number;
  replyTo: number;
  contentType: number;
}

let items: ExtendedQuickPickItem[];

/**
 * 异步获取Box3的评论列表。
 * @returns {Promise<ExtendedQuickPickItem[]>} 返回扩展的快速选择项数组。
 */
async function getBox3CommentList(): Promise<ExtendedQuickPickItem[]> {
  // 使用Box3Get发送请求获取评论列表
  const response = await Box3Get(
    {
      url: "msg/comment?offset=0&limit=100",
    },
    "账号评论",
  );

  // 检查响应是否成功，如果不成功则显示错误并返回空数组
  if (!response || response.code !== 200) {
    showErrorMessage(`获取评论失败: ${response?.msg}`);
    return [];
  }

  // 初始化items数组，并遍历响应数据，填充items
  items = [];
  for (const value of response.data.rows) {
    items.push({
      label: `${escapeHtml(value.nickname)}(${value.commentUserId.toString()})`,
      description: escapeHtml(value.reply ?? ""),
      detail: `${escapeHtml(value.comment)}`,
      contentId: value.contentId,
      contentType: value.contentType,
      replyTo: value.commentId,
    });
  }
  return items;
}

/**
 * 异步回复Box3的评论。
 * @param {string} comment 要回复的评论内容。
 * @param {number} contentId 内容ID。
 * @param {number} replyTo 回复的评论ID。
 * @param {number} contentType 内容类型。
 * @returns {Promise<boolean>} 返回一个布尔值，表示回复是否成功。
 */
async function replyBox3CommentList(
  comment: string,
  contentId: number,
  replyTo: number,
  contentType: number,
): Promise<boolean> {
  // 使用Box3Post发送请求进行评论回复
  const response = await Box3Post(
    {
      url: "comment",
      data: {
        comment: comment,
        contentId: contentId,
        contentType: contentType,
        replyTo: replyTo,
      },
    },
    "账号评论回复",
  );

  // 检查响应是否成功，如果不成功则显示错误并返回false
  if (!response || response.code !== 200) {
    showErrorMessage(`回复评论失败: ${response?.msg}`);
    return false;
  }
  showInformationMessage(`回复评论成功`);
  return true;
}

/**
 * 主函数，用于选择并回复Box3的评论。
 */
export default async function selectBox3Comment() {
  // 检查授权状态，如果没有授权则提示登录并返回
  if (!auth) {
    showErrorMessage(arenaErrorMsg.LOG_IN_TO_THE_SHINJIMA_ACCOUNT);
    vscode.commands.executeCommand(CommandId.userCenterTool_setting);
    return;
  }
  try {
    // 获取评论列表
    const dataSource = await getBox3CommentList();
    // 检查获取的评论数据是否存在
    if (!dataSource) {
      return;
    }
    if (!dataSource.length) {
      showErrorMessage(arenaErrorMsg.FAILED_TO_OBTAIN_THE_LIST);
      return;
    }
    // 显示快速选择框，让用户选择要回复的评论
    const selectedOption = await vscode.window.showQuickPick(dataSource, {
      title: "ArenaPro：评论我的，最新100条",
      matchOnDescription: true,
      canPickMany: false,
    });

    // 如果用户选择了评论，则显示输入框并获取回复内容
    if (selectedOption) {
      vscode.window
        .showInputBox({
          placeHolder: "回复：" + selectedOption.label,
          prompt: "【建议不超80字】你将回复评论：" + selectedOption.detail,
          ignoreFocusOut: true,
        })
        .then((input) => {
          // 如果用户输入了内容，则进行评论回复
          if (input) {
            replyBox3CommentList(
              input,
              selectedOption.contentId,
              selectedOption.replyTo,
              selectedOption.contentType,
            );
          }
        });
    }
  } catch (error) {
    // 如果发生错误，则显示错误消息
    showErrorMessage(`选择操作遇到错误: ${error}`);
  }
}
